package map;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.function.Consumer;

/**
 * Map的遍历, 支持三种遍历方式"
 * 1.遍历所有的键值对
 * 2.遍历所有的key
 * 3.遍历所有的value(相对不常用)
 */
public class MapDemo2 {
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        map.put("语文", 99);
        map.put("数学", 95);
        map.put("英语", 97);
        map.put("物理", 94);
        map.put("化学", 99);
        System.out.println(map);//{物理=96,数学=95,化学=99,语文=99,英语=97}

        /**
        遍历的key, 将当前map中所有的key一一个Set集合的形式返回
         */
        Set<String> keySet = map.keySet();
        for(String key: keySet){
            System.out.println("key:"+key);//key:物理,key:数学,key:化学,key:语文,key:英语
        }

        /**
        遍历所有键值对
        Set<Map.Entry> entrySet();
        当前map中的me一组键值对一一个Entry实例表示,将所有键值对以Set集合返回
        Entry:条目
         */
        Set<Map.Entry<String, Integer>> entrySet = map.entrySet();
        for (Map.Entry<String,Integer> e :entrySet){//e代表每一个键值对
            String key = e.getKey();//获取key键
            Integer value = e.getValue();//获取value值
            System.out.println("key:"+key+",value:"+value);
        }

        /**
        遍历所有的value
        Collection values()
        将当前map中的value值以Collection集合的形式返回
         */
        Collection<Integer> values = map.values();
        for (Integer value : values){
            System.out.println("value:"+value);
        }



        /**
        jdk1.8之后, 集合和map提供了forEach方法, 基于lambda表达式遍历
         */

        values.forEach(new Consumer<Integer>(){
            public void accept(Integer value){
                System.out.println("value:"+value);
            }
        });

        /*
            JDK8之后集合框架支持了使用lambda表达式遍历。因此Map和Collection都
            提供了foreach方法，通过lambda表达式遍历元素。
         */
        values.forEach(System.out::println);//集合forEach()方法

        map.forEach((k,v)-> System.out.println(k+":"+v));//map的forEach()方法


    }
}
